(calculator-expt): Use more cases to determine the value.
authorJay Belanger <jay.p.belanger@gmail.com>
Wed, 4 Jul 2007 13:53:11 +0000 (13:53 +0000)
committerJay Belanger <jay.p.belanger@gmail.com>
Wed, 4 Jul 2007 13:53:11 +0000 (13:53 +0000)
lisp/calculator.el

index c1e0edb627648896789e855a8c570c566cc930a7..b0e3069d3e1b8107e0e3914e9788743a02389204 100644 (file)
@@ -1793,14 +1793,28 @@ To use this, apply a binary operator (evaluate it), then call this."
       (expt x y)
     (domain-error 0.0e+NaN)
     (range-error
-     (if (> y 0) 
-         (if (and
-              (< x 0)
-              (= y (truncate y))
-              (oddp (truncate y)))
-             -1.0e+INF
-           1.0e+INF)
-       0.0))
+     (cond
+      ((and (< x 1.0) (> x -1.0))
+       ;; For small x, the range error comes from large y.
+       0.0)
+      ((and (> x 0.0) (< y 0.0))
+       ;; For large positive x and negative y, the range error 
+       ;; comes from large negative y.
+       0.0)
+      ((and (> x 0.0) (> y 0.0))
+       ;; For large positive x and positive y, the range error 
+       ;; comes from large y.
+       1.0e+INF)
+      ;; For the rest, x must be large and negative.
+      ;; The range errors come from large integer y.
+      ((< y 0.0)
+       0.0)
+      ((oddp (truncate y))
+       ;; If y is odd
+       -1.0e+INF)
+      (t
+       ;; 
+       1.0e+INF)))
     (error 0.0e+NaN)))
 
 (defun calculator-fact (x)